#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Hash Storage 使用示例"""

import os
from pathlib import Path
from hash_storage import HashStorage


def main():
    """主函数"""
    # 方式1：使用环境变量创建HashStorage实例
    storage = HashStorage()
    
    # 方式2：使用自定义配置创建HashStorage实例
    # storage = HashStorage(
    #     access_key="your_access_key",
    #     secret_key="your_secret_key", 
    #     url="http://localhost:9000",
    #     bucket="your_bucket"
    # )
    
    print("=== Hash Storage 示例 ===")
    
    # 创建测试文件
    test_dir = Path("test_files")
    test_dir.mkdir(exist_ok=True)
    
    # 创建测试文件1
    test_file1 = test_dir / "test1.txt"
    with open(test_file1, 'w', encoding='utf-8') as f:
        f.write("这是测试文件1的内容")
    
    # 创建测试文件2（相同内容）
    test_file2 = test_dir / "test2.txt"
    with open(test_file2, 'w', encoding='utf-8') as f:
        f.write("这是测试文件1的内容")  # 相同内容，测试去重
    
    # 创建测试文件3（不同内容）
    test_file3 = test_dir / "test3.txt"
    with open(test_file3, 'w', encoding='utf-8') as f:
        f.write("这是测试文件3的不同内容")
    
    # 创建子文件夹和文件
    sub_dir = test_dir / "subfolder"
    sub_dir.mkdir(exist_ok=True)
    
    sub_file = sub_dir / "sub_test.txt"
    with open(sub_file, 'w', encoding='utf-8') as f:
        f.write("这是子文件夹中的文件")
    
    print("\n1. 上传单个文件")
    # 上传单个文件
    if storage.upload(test_file1):
        print(f"✓ 成功上传: {test_file1.name}")
    else:
        print(f"✗ 上传失败: {test_file1.name}")
    
    # 上传相同内容的文件（测试去重）
    if storage.upload(test_file2):
        print(f"✓ 成功上传: {test_file2.name}")
    else:
        print(f"✗ 上传失败: {test_file2.name}")
    
    # 上传不同内容的文件
    if storage.upload(test_file3):
        print(f"✓ 成功上传: {test_file3.name}")
    else:
        print(f"✗ 上传失败: {test_file3.name}")
    
    print("\n2. 上传文件夹")
    # 上传整个文件夹
    if storage.upload(test_dir):
        print(f"✓ 成功上传文件夹: {test_dir.name}")
    else:
        print(f"✗ 上传文件夹失败: {test_dir.name}")
    
    print("\n3. 列出所有文件")
    # 列出所有文件
    files = storage.list_files()
    for file in files:
        print(f"  - {file}")
    
    print("\n4. 获取文件信息")
    # 获取文件信息
    for filename in ["test1.txt", "test2.txt"]:
        info = storage.get_file_info(filename)
        if info:
            print(f"文件: {info['filename']}")
            print(f"  哈希: {info['hash'][:16]}...")
            print(f"  相同内容的文件: {info['same_content_files']}")
        else:
            print(f"文件不存在: {filename}")
    
    print("\n5. 下载文件")
    # 创建下载目录
    download_dir = Path("downloads")
    download_dir.mkdir(exist_ok=True)
    
    # 下载单个文件
    for filename in ["test1.txt", "subfolder/sub_test.txt"]:
        output_path = download_dir / filename
        if storage.download(filename, output_path):
            print(f"✓ 成功下载: {filename} -> {output_path}")
        else:
            print(f"✗ 下载失败: {filename}")
    
    print("\n6. 下载目录")
    # 下载整个子文件夹
    subfolder_download_dir = download_dir / "downloaded_subfolder"
    if storage.download("subfolder", subfolder_download_dir):
        print(f"✓ 成功下载目录: subfolder -> {subfolder_download_dir}")
    else:
        print(f"✗ 下载目录失败: subfolder")
    
    # 下载整个test_files目录
    full_download_dir = download_dir / "downloaded_test_files"
    if storage.download("test_files", full_download_dir):
        print(f"✓ 成功下载目录: test_files -> {full_download_dir}")
    else:
        print(f"✗ 下载目录失败: test_files")
    
    print("\n7. 测试文件内容更新")
    # 修改文件内容并重新上传
    with open(test_file1, 'w', encoding='utf-8') as f:
        f.write("这是修改后的文件内容")
    
    if storage.upload(test_file1):
        print(f"✓ 成功更新文件: {test_file1.name}")
        
        # 查看更新后的文件信息
        info = storage.get_file_info("test1.txt")
        if info:
            print(f"  新哈希: {info['hash'][:16]}...")
            print(f"  相同内容的文件: {info['same_content_files']}")
    
    # 重命名功能示例
    print("\n=== 重命名功能示例 ===")
    files = storage.list_files()
    if files:
        old_name = files[0]
        new_name = f"renamed_{old_name}"
        print(f"重命名文件: {old_name} -> {new_name}")
        if storage.rename_file(old_name, new_name):
            print("重命名成功")
        else:
            print("重命名失败")
    
    # 重命名目录示例
    if "test_files" in [f.split('/')[0] for f in storage.list_files() if '/' in f]:
        print("重命名目录: test_files -> renamed_folder")
        if storage.rename_directory("test_files", "renamed_folder"):
            print("目录重命名成功")
        else:
            print("目录重命名失败")
    
    # 删除功能示例（注意：这只删除meta信息）
    print("\n=== 删除功能示例 ===")
    current_files = storage.list_files()
    if current_files:
        file_to_delete = current_files[0]
        print(f"删除文件: {file_to_delete}")
        if storage.delete_file(file_to_delete):
            print("文件删除成功")
        else:
            print("文件删除失败")
    
    # 删除目录示例
    remaining_files = storage.list_files()
    directories = set(f.split('/')[0] for f in remaining_files if '/' in f)
    if directories:
        dir_to_delete = list(directories)[0]
        print(f"删除目录: {dir_to_delete}")
        if storage.delete_directory(dir_to_delete):
            print("目录删除成功")
        else:
            print("目录删除失败")

    print("\n=== 示例完成 ===")
    print("\n提示:")
    print("- 相同内容的文件会被去重存储")
    print("- 本地缓存位于 ~/.cache/hash_storage/")
    print("- 可以使用 storage.clear_cache() 清空缓存")
    
    # 清理测试文件
    import shutil
    if test_dir.exists():
        shutil.rmtree(test_dir)
    if download_dir.exists():
        shutil.rmtree(download_dir)
    print("\n测试文件已清理")


if __name__ == "__main__":
    main()